Docker Container
Table of Contents
容器列表
$ docker ps [OPTIONS] # 显示容器列表及相关信息
$ docker ps
$ docker ps -a, --all # 显示所有容器, 包括未运行的
$ docker ps -s, --size # 显示正在运行的容器, 显示容器大小
$ docker ps -q, --quite # 仅显示容器 ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
7eab1cd126af 43761bd5b76d "docker-entrypoint.s…" 43 hours ago Up 43 hours 27017/tcp person 0B (virtual 700MB)
ee0c15a3a0ee mongo "docker-entrypoint.s…" 44 hours ago Up 44 hours 0.0.0.0:8589->27017/tcp demo 0B (virtual 700MB)
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES | SIZE |
---|---|---|---|---|---|---|---|
容器 ID | 生成容器的镜像 | 启动容器时运行的命令 | 容器创建时间 | 容器状态 | 机器端口->容器端口 | 容器名称 | 容器大小 |
$ docker stop <CONTAINER ID | NAMES> # 关闭容器
$ docker start <CONTAINER ID | NAMES> # 启动容器
$ docker kill <CONTAINER ID | NAMES> # 杀死容器进程
$ docker restart <CONTAINER ID | NAMES> # 重启容器
$ docker rm -f <CONTAINER ID | NAMES> # 强制删除容器(运行中的容器也会删除)
$ docker logs <CONTAINER ID | NAMES> # 显示指定容器 log
$ docker top <CONTAINER ID | NAMES> # 列出指定容器进程
$ docker port <CONTAINER ID | NAMES> # 显示容器的端口映射
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...] # 进入容器执行命令(容器在运行状态才可进入)
$ docker exec -it mongo-slave1 bash # 以交互式进入 mongo-slave1 容器,执行 bash, 并留在容器中(exit 退出容器)
$ docker exec mongo-slave1 mongosh --version # 进入 mongo-slave1 容器查看 mongosh 版本并退出
> 1.6.1
创建容器
使用 docker run
命令创建容器, 使用不通参数将容器内端口或路径映射到主机(映射都是 server:docker 结构)
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
-d, --detach # 后台运行容器,并输出容器ID
-e, --env list # 设置环境变量,该变量可以在容器内使用
-h, --hostname string # 指定容器的hostname
-i, --interactive # 以交互模式运行容器,通常与-t同时使用
-l, --label list # 给容器添加标签
--name <name> # 设置容器名称,否则会自动命名
--network string # 将容器加入指定网络
-p, --publish list # 设置容器映射端口 <server port>:<docker port>
-P,--publish-all # 将容器设置的所有exposed端口进行随机映射
--restart <restart option> # 容器重启策略,默认为不重启
on-failure[:max-retries]: # 在容器非正常退出时重启,可以设置重启次数。
unless-stopped: # 总是重启,除非使用stop停止容器
always: # 总是重启
--rm # 容器退出时则自动删除容器
-t, --tty # 分配一个伪终端
-u, --user <username> # 运行用户或者UID
-v, --volume list # 容器目录映射到主机目录 <server path>:<docker path>
-w, --workdir <work path> # 容器的工作目录
--privileged # 给容器特权
容器和主机环境是隔离的, docker 提供一些方法进入容器
- 将容器内端口映射到主机端口, 通过主机端口连接容器
- 将容器内路径映射到主机路径, 通过修改主机映射路径文件同步到容器内
docker exec
命令进入容器
# 使用 mongo 镜像创建 demo 容器, 后台运行, 容器 27017 端口映射机器 8589 端口
$ docker run -d -p 8589:27017 --name demo mongo
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee0c15a3a0ee mongo "docker-entrypoint.s…" 13 seconds ago Up 11 seconds 0.0.0.0:8589->27017/tcp demo
$ docker run -d \
-p 5432:5432 \ # 端口映射 server port:docker port
--name postgres \ # 容器名称
-e POSTGRES_PASSWORD=root \ # 设置容器内环境变量(数据库密码)
-e TZ=Asia/Shanghai \ # 设置容器内环境变量(数据库时区)
-v /root/postgres:/var/lib/postgresql/data \ # 容器目录映射到主机路径
postgres # 指定镜像
# 创建容器(自动命名), 创建后进入容器执行 bash, 退出容器后自动删除容器
$ docker run -it --rm ubuntu bash
docker-compose
在命令行可以通过 docker run
创建容器, 为了更简单更快创建多个复杂容器有了 docker-compose
创建 docker-compose.yml
定义容器, 然后一键拉起多个复杂容器, 且可以重复使用
Docker Compose 离线安装包
# 下载离线工具后, 改名添加权限, 放到 docker 插件路径下
$ mv docker-compose-linux-x86_62 docker-compose
$ chmod +x docker-compose
$ mkdir -p /usr/lib/docker/cli-plugins
$ cp docker-compose /usr/lib/docker/cli-plugins/
$ docker compose version
> Docker Compose version v2.33.1
# docker compose v1.27 后 无需 version 关键字
version: "3"
services:
# service 名称, docker compose 以 service 名称做唯一标识
mongo:
image: mongo:latest
container_name: demo
ports:
- 8589:27017
postgres:
image: postgres:latest
container_name: postgres
restart: always
ports:
- 5432:5432
volumes:
- /root/postgres:/var/lib/postgresql/data
environment:
TZ: Asia/Shanghai
POSTGRES_PASSWORD: root
# 在当前路径下寻找 docker-compose.yml 文件创建容器并后台执行
$ docker compose up -d
> [+] Running 1/2
> ⠴ Network docker_default Created
> ✔ Container docker-redis-1 Started
# 指定 docker compose 文件创建容器
$ docker compose -f docker-compose.yml up -d
# 默认前台执行, 加 -d 后台. 创建容器服务(容器不存在), 启动服务(容器服务未运行), 重启服务(容器服务运行中)
$ docker compose up
# 启动已存在且停止的容器服务(默认后台执行), 添加 service 名称启动指定 service
$ docker compose start [service]
# 启动已存在且停止的容器服务(后台执行)
$ docker compose stop [service]
# 停止并删除指定容器服务(加 -v 同时删除数据卷)
$ docker compose down redis
> [+] Running 2/2
> ✔ Container docker-redis-1 Removed
> ✔ Network docker_default Removed
# 读取 docker-compose.yml 文件, 查看配置信息
$ docker compose config
services:
backend:
image: example/database
environment:
- TZ=Asia/Shanghai # 设置时区
volumes:
- db-data:/etc/data
networks:
- db-network
backup:
image: backup-service
volumes:
- db-data:/var/lib/backup/data
networks:
- db-network
# 设置共享数据卷和网络
volumes:
db-data:
networks:
db-network:
指定 dockerfile 文件 build 并拉起服务
# 配置环境变量
echo GIT_USERNAME="xxxx" > .env
echo GIT_PASSWORD="xxxx" >> .env
echo TAG=$(date +"%Y%m%d") >> .env
docker-compose 配置文件
services:
backend1:
build:
dockerfile: ./backend/Dockerfile
context: .
no_cache: true
args:
USERNAME: $GIT_USERNAME
PASSWORD: $GIT_PASSWORD
image: backend:${TAG}
container_name: backend1
restart: always
volumes:
- /home/desktop/log/backend/8091:/root/backend/log
ports:
- 8091:8000
backend2:
depends_on:
- backend1
image: backend:${TAG}
container_name: backend2
restart: always
volumes:
- /home/desktop/log/backend/8092:/root/backend/log
ports:
- 8092:8000
# build 镜像和拉起容器
$ docker compose build
$ docker compose up -d